package com.gitee.qdbp.base.shiro.token;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.shiro.authc.UsernamePasswordToken;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

/**
 * 透传所有提交参数的TOKEN
 *
 * @author zhaohuihua
 * @version 160112
 */
public class FormParamToken extends UsernamePasswordToken {

    /** 版本序列号 **/
    private static final long serialVersionUID = 120589811658545149L;

    /** 其他请求参数 **/
    private Map<String, String[]> params = new HashMap<>();

    /** 设置请求参数 **/
    public void addParams(Map<String, String[]> params) {
        this.params.putAll(params);
    }

    /** 增加请求参数 **/
    public void addParam(String key, String value) {
        this.params.put(key, new String[] { value });
    }

    /** 增加请求参数 **/
    public void addParam(String key, String[] values) {
        this.params.put(key, values);
    }

    /** 获取请求参数 **/
    public String getParam(String key) {
        String[] values = this.params.get(key);
        if (values == null || values.length == 0) {
            return null;
        } else {
            return values[0];
        }
    }

    /** 获取请求参数 **/
    public String[] getParams(String key) {
        return this.params.get(key);
    }

    /** 将请求参数转换为对象 **/
    public <T> T toObject(Class<T> clazz) {
        JSONObject map = new JSONObject();
        for (Entry<String, String[]> entry : params.entrySet()) {
            String[] values = entry.getValue();
            if (values != null && values.length > 0) {
                map.put(entry.getKey(), values[0]);
            }
        }
        return JSON.toJavaObject(map, clazz);
    }

    public String toString() {
        JSONObject params = new JSONObject();
        for (Entry<String, String[]> entry : this.params.entrySet()) {
            String[] values = entry.getValue();
            if (values != null && values.length > 0) {
                params.put(entry.getKey(), values[0]);
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("username", getUsername());
        map.put("params", params);
        return JSON.toJSONString(map);
    }
}
